Skip to content

test(vi-mock): inherit the real @object-ui/plugin-list surface in 9 vi.mock factories (objectui#6892 slice 12) - #8250

Merged
baozhoutao merged 5 commits into
mainfrom
claude/issue-6892-vi-mock-inherit-slice12-plugin-list
Sep 7, 2026
Merged

test(vi-mock): inherit the real @object-ui/plugin-list surface in 9 vi.mock factories (objectui#6892 slice 12)#8250
baozhoutao merged 5 commits into
mainfrom
claude/issue-6892-vi-mock-inherit-slice12-plugin-list

Conversation

@claude

@claude claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Part of #6892 (slice 12: @object-ui/plugin-list)

Nine vi.mock('@object-ui/plugin-list', ...) factories under
packages/app-shell/src/views hand-listed ListView and froze the barrel's other
eleven exports at whatever was typed that day. Each now spreads the real module
first and keeps its own ListView double as the override after it, so only the
SURFACE the double sits on becomes real. The specifier joins COVERED_SPECIFIERS
in the same PR, per the gate's documented widening precondition.

No assertion, no test behaviour, no product source and no package.json is
touched. The diff is nine factory headers, the gate's covered set and header
record, and one empty-frontmatter changeset.

Bases. Branch cut from 190cd07b3 (the slice-11 merge). origin/main moved
twice mid-slice, so it was merged in twice with merge commits (never rebased) and
every reading below was re-taken on the merged head: c85116068, then
31a0d055b. Final head f4c9a8768; every exit code below is pinned to it.

⚠️ Notation: a few spellings below are written in words rather than literally,
because GitHub's body sanitizer silently deletes tag-shaped fragments (AGENTS.md,
"GitHub 会改写你写进 issue/PR 正文的字节"). Where the repair's type argument is
described, the generic brackets around typeof import('@object-ui/plugin-list')
are omitted from the prose and live only in the diff.

STEP 0 — PROCEED

Method. The static import graph was walked from packages/plugin-list/src/index.tsx
with the TypeScript parser, every module-scope statement of every reached module
classified, and import-time effects re-classified by a second AST pass that STOPS at
every function-like boundary (a statement-level regex over the same graph reports 18
"effects", and all 18 are matches inside arrow-function bodies that do not run at
import — prefer the parser). Aliases were read out of vitest.config.mts itself;
TS ESM './x.js' specifiers resolved to ./x.ts / ./x.tsx. Corroborated
empirically by importing the real barrel under the light dom project, which is
the single project all ten sites run in.

Graph. 539 modules, 5,777 module-scope statements (2,376 import/export, 1,226
fn/class, 967 bindings, 803 type declarations, 405 other) over twelve workspace
packages: components 206, core 95, fields 77, react 64, i18n 27, types 17, mobile
16, permissions 10, plugin-list 8, sdui-parser 8, data-objectstack 6, providers 5.
98 bare side-effect imports (the @object-ui/components renderer cascade) and one
CSS import, inert because the root Vitest config declares no css option.

Registrations — NOT inert, and every one namespaced. 115 module-scope
ComponentRegistry.register(...) calls, ZERO of them bare: ui 85, element 10,
page 7, action 5, plugin-list 2, view 1. The five rows in
packages/components/src/renderers/layout/page.tsx that READ as bare carry
namespace: 'ui' through the spread pageMeta constant declared at page.tsx:662
— the namespace lives in register()'s THIRD argument, never in the key — so the
deprecation console.warn in register() cannot fire. Beyond registration the
graph is allocation only: 173 React.forwardRef, 84 new Set, 21 createContext,
16 Object.freeze, 13 new Map, 13 cva, 13 createSafeTranslation, 10
createDiscardProofCache, plus the benign packages/fields class slice 7 already
measured (five registerFieldRenderer map writes, one setCellRendererResolver
assignment, registerAllFields()). ZERO timers, globals, storage, fetch and
connections at import time.

Empirically, importing the real barrel under the light dom project exports
12 names, moves ComponentRegistry.getAllTypes() from 0 to 375 keys, and emits
ZERO console.warn and ZERO console.error (three runs, identical).

Import cost — decided on the AGGREGATE

reading value
isolated cold import of the barrel, light dom project 6205 ms median (5589 / 6205 / 7230)
marginal, InterfaceListPage.mapConfig (24 modules added) 9.58 s frozen to 9.98 s inheriting = +0.40 s
marginal, ObjectView.createPredicates (8 modules added) 10.26 s to 10.86 s = +0.60 s
marginal, ObjectDataPage.createAffordances (24 added) 9.02 s to 8.85 s = -0.17 s, within noise
aggregate, all ten files as ONE invocation, interleaved A/B pair 1 27.00 s frozen to 25.97 s inheriting (-1.03 s); pair 2 26.28 s to 28.57 s (+2.29 s)
tests in both states 113 passed / 113 passed, every run

Each per-file figure is the median of three runs. The aggregate was taken as an
INTERLEAVED A/B against the committed tree under a trap, because this shared box
drifted by ten seconds across the hour (the same ten files read 37.25 s median
early and 26.6 s median later, in the same frozen state). One pair alone would have
"decided" the slice in either direction; the two together read as noise. Nowhere
near objectui#6580's STOP band.

Mechanism, measured rather than argued. Every one of the ten files already
holds 515 to 539 of the barrel's 539 modules at module scope — the three view
components under test (ObjectView.tsx, InterfaceListPage.tsx,
ObjectDataPage.tsx) each import ListView from this specifier and their own
graphs pull the rest. Inheriting adds 8 modules in seven files and 24 in the other
two. That is why the marginal is uniform and small, and not slice 10's bimodal
shape.

Slice 11's deferred-cost class does not fire. No React.lazy and no dynamic
import() of @object-ui/plugin-list exists anywhere in packages/ or apps/
(two greps, both empty). All three consuming views import it at MODULE SCOPE, so
the inheritance cost lands in the import phase where no timeout applies. No file
needed a module-scope import, and no timeout was touched.

STEP 1 — the census, through the gate's own scan()

Re-derived on 190cd07b3 with scan() imported and covered widened IN MEMORY to
the 22 workspace specifiers any vi.mock call site names. COVERED_SPECIFIERS was
never widened-and-reverted on disk.

judged inheriting frozen files
@object-ui/plugin-list before 10 1 9 10
@object-ui/plugin-list after 10 10 0 10

All-specifier population: 40 to 31 frozen over 660 judged, and a diff of the two
per-specifier tables with the @object-ui/plugin-list row removed is EMPTY — no
site moved the other way. The PM's 10 / 1 / 9 forecast is EXACT, as is the owning
location: all ten sit in one directory, packages/app-shell/src/views.

Three syntactic shapes, not one — a refinement on the dispatch, which described
the double as the schema-columns renderer. Only one of the nine is that:

  • 4 one-line object-literal arrows whose ListView double returns null;
  • 3 multi-line ones whose double captures props.schema into a module-level
    binding and returns null;
  • 2 whose double renders a JSX probe element carrying a data-testid and a
    JSON-serialised slice of props.schema.

Each hand-listed exactly ONE of the barrel's twelve exports. Every double is
unchanged by this PR; only the surface it sits on becomes real. None of the nine
reads a prop the real ListView would not — all three shapes read props.schema
or a path under it, which ListViewProps declares (A5: no phantom prop taught).

The free confirmation is present, and it is the strongest kind for this slice.
ObjectView.chartRelay-7823.test.tsx already inherited the real barrel on main,
passes, and carries a frozen sonner neighbour of its own — so the real barrel was
known to load in the light dom project ALONGSIDE that neighbour before anything
was converted. None of the ten is in heavyDomTests or domTsTests; all ten are
.test.tsx under the light dom project, so one environment is the whole answer.

Neighbour reading — ZERO repairs, predicted in advance

Every OTHER factory in all ten files was classified through the gate's own
findCallSites BEFORE any edit, then judged against the walked graph.

neighbour sites verdict
@object-ui/auth 10 inheriting
@object-ui/permissions 8 inheriting
@object-ui/collaboration 7 inheriting
@object-ui/plugin-view 7 inheriting
@object-ui/i18n 2 inheriting
@object-ui/react 2 inheriting
sonner 7 FROZEN (third-party, out of scope by construction)
react-router-dom 2 FROZEN (third-party, out of scope by construction)
local whole-module replacements 13 out of scope by construction

⚠️ The sonner pairing is the interesting one, and the neighbour rule as
previously stated would have predicted a repair.
This barrel's graph DOES reach
sonner — three imports — and seven of the ten files carry a frozen sonner
factory, which is exactly the pairing that killed 15 files in slice 6. It is benign
here for a reason worth recording: the two renderer modules that import it read
toast.success and friends only INSIDE their click handlers, and
packages/components/src/ui/sonner.tsx re-exports toast at module scope but
dereferences the Toaster binding only inside a component body. The frozen
factories all provide toast. So the sharper rule is: a frozen neighbour is
dangerous when the newly-real graph reads a MISSING BINDING from it AT MODULE
SCOPE — reach alone is necessary, not sufficient.
The two react-router-dom
factories are safe by reach: no module in the graph imports it at all (the two
matches are prose in comments).

No file among the ten mocks @object-ui/app-shell — re-derived on this base,
confirming the PM's comm reading of 0. The parked specifier (objectui#8173) stays
parked and untouched.

Dependency-edge reading

packages/app-shell/package.json declares @object-ui/plugin-list as a
workspace:^ PEER dependency at line 104 and a workspace:* DEV dependency at
line 121; apps/console/package.json declares it as a workspace:* DEV dependency
at line 82. All ten converted files live in packages/app-shell, so app-shell's
pair is the one that licenses the repair's type argument; the console edge is
recorded but unused by this slice. pnpm check:phantom-deps exits 0 on the final
head (40 released packages, 3,988 source files, 20,215 specifiers).

Covered set: sixteen to seventeen

Exactly one line added to COVERED_SPECIFIERS ('@object-ui/plugin-list', exact
string match), the header count word sixteen to seventeen, the slice-12
per-specifier record added in the shape slices 5 to 11 used, and the
remaining-population paragraph refreshed 40 to 31 with @object-ui/app-shell
re-annotated as PARKED under objectui#8173. The remaining rows are
@object-ui/app-shell (23, all frozen, parked) and @object-ui/fields (8 of 10).

The record was written WITHOUT the shape objectui#8117's pin rejects; a mechanical
grep -nP over the whole gate source for that pattern returns 0 matches. The pin
needed no edit — confirmed by RUNNING it, exit 0, 67/67, file unedited: it still
derives its names from COVERED_SPECIFIERS rather than copying them.

Positive control — two legs, from the committed tree

Both legs ran under a trap with ABSOLUTE paths against
packages/app-shell/src/views/ObjectView.createPredicates.test.tsx, HEAD blob
8aa55c0ab80622062fbb4e7740ce0ec45a2cfc7d. Each mutation is proven ON DISK by a
count anchored on the plugin-list spread line SPECIFICALLY (this file carries three
other spreads, so a file-wide count would never fall to zero) AND by a changed blob,
before the gate result is read. Each restore is proven by STATE, never by a checkout
exit code.

leg mutated blob gate reason printed
control, unmutated 8aa55c0ab… (equals HEAD) exit 0
1: obtain, bind, never spread 25b5bca0f39b82b395ad3a6b7c11a16d3de02fbb exit 1 "the factory obtains the real module but never spreads it"
2: full freeze (the exact base form) 1a708802033a95f473b535544c1254cdd530109e exit 1 "the factory never obtains the real module"

Both legs name ObjectView.createPredicates.test.tsx:103 on
vi.mock("@object-ui/plugin-list"). Leg 1 is objectui#8183's canonical control
shape, not the mention-only one. Leg 2's blob is BYTE-IDENTICAL to this file at the
base 190cd07b3, so the leg provably reconstructed the exact frozen form the gate
must reject. The anchored count read 1 to 0 on both legs; after each restore
git hash-object equalled the HEAD blob and git diff HEAD named zero paths, and
git status was empty at the end. No dist preflight is owed: the gate is a
source-text scanner that reads tracked paths from disk, and both configs alias the
specifier to source.

Gates — every exit code pinned to f4c9a8768

Each captured by redirect-then-capture, never through a pipe.

gate result
node scripts/check-vi-mock-inherit.mjs exit 0 — 613 call sites on seventeen specifiers judged, 613 inherit, 0 auto-mocked; 0 frozen for @object-ui/plugin-list; 4414 tracked source files, 2686 test-named, 609 carry a mock
gate pin, scripts/__tests__/check-vi-mock-inherit.test.ts exit 0, 67/67, file UNEDITED
whole scripts/__tests__/ directory exit 0, 115 files / 3415 tests
the ten converted files exit 0, 10 files / 113 tests — the SAME count as the same ten frozen, so no test was lost, gained, or died during collection
vitest packages/app-shell/, four shards exit 0 in all four — 644 files, 6200 passed, 1 skipped, 0 failed
app-shell type-check exit 0; non-vacuous by tsconfig.test.json --listFiles naming all nine edited files in a 4,448-file program
pnpm type-check:scripts exit 0
pnpm lint:root exit 0 (0 errors, 32 warnings)
app-shell lint exit 0 (0 errors, 2914 warnings)
targeted eslint --no-inline-config --format json over the 10 non-changeset paths exit 0 — 10 files, 0 errors, 51 warnings
pnpm check:phantom-deps exit 0
pnpm check:control-bytes exit 0, plus a grep -naP control-byte self-scan of every changed path (grep exit 1, no match)
node scripts/check-changeset-presence.mjs exit 0 — one EMPTY-frontmatter changeset, which it demanded (nine packages/app-shell source files of one released package)
node scripts/check-changeset-no-major.mjs exit 0
node scripts/check-governed-queue-guard.mjs --test NOT GOVERNED — 11 paths against 5 governed surfaces, none matched
pnpm check:entry-guard exit 0
pnpm check:vi-mock-specifiers exit 0

The whole-package lints cover every changed path, so the targeted eslint run
above is corroboration rather than a narrowing. Type-aware linting is NOT enabled
in eslint.config.js (no project / projectService), so this diff cannot move
the verdict on any file it does not touch.

Live E2E (informational) is base-red on every branch today for an upstream reason
(#7990 / objectstack#16186) and is not this PR's.

Slice 13 forecast

@object-ui/fields — 10 judged / 2 inheriting / 8 frozen on f4c9a8768, the only
remaining row once @object-ui/app-shell (23 of 23) is skipped as PARKED under
objectui#8173. It has a free confirmation, as this slice did.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

…i.mock factories

Slice 12 of objectui#6892. Nine `vi.mock('@object-ui/plugin-list', ...)`
factories under `packages/app-shell/src/views` hand-listed `ListView` and
froze the barrel's other eleven exports at whatever was typed that day. Each
now spreads the real module first and keeps its own `ListView` double as the
override after it, so only the surface the double sits on becomes real.

No assertion, no test behaviour and no product source is touched: the diff is
nine factory headers. The tenth site on this specifier
(`ObjectView.chartRelay-7823.test.tsx`) already inherited on main and is the
slice's free confirmation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
The sweep in the previous commit takes this specifier to zero frozen call
sites, which is the documented precondition for widening `COVERED_SPECIFIERS`.
Sixteen members become seventeen; the header gains slice 12's per-specifier
record (graph walk, import-cost reading on the aggregate, neighbour reading)
and the remaining-population paragraph is refreshed 40 -> 31 frozen over 660
judged, with `@object-ui/app-shell` still PARKED under objectui#8173.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Empty frontmatter: nine `packages/app-shell` spec files and one CI script
changed, no product source and no manifest.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
… the merged head)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3191.0 KB 3191.4 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-XPCbTDEt.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 498.00KB 113.91KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 189.11KB 52.55KB
fields (index.js) 243.04KB 61.36KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 47.67KB 13.25KB
plugin-charts (index.js) 70.62KB 19.71KB
plugin-chatbot (index.js) 193.54KB 46.04KB
plugin-dashboard (index.js) 131.41KB 34.43KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 247.68KB 63.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.58KB 56.63KB
plugin-kanban (index.js) 52.83KB 14.63KB
plugin-list (index.js) 113.38KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Contributor

Armed — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

  • CI on f4c9a8768 converged all green at 04:55:09Z (31 checks, Live E2E (informational) green as well — no standing-down note was owed on this PR).
  • Ready for review at 04:55:20Z; post-flip Governed Surface Queue Guard completed/success at 04:55:38Z.
  • Auto-merge SQUASH enabled; added_to_merge_queue on the REST timeline at 04:55:44Z (read 04:55:49Z).

Landing stroke follows the merge: content probe on re-fetched origin/main ('@object-ui/plugin-list' inside COVERED_SPECIFIERS, expected 17 entries, with a control), LANDED here and on objectui#6892 (which stays open, Part of), then the slice-13 claim (@object-ui/fields).


Generated by Claude Code

Merged via the queue into main with commit 3404893 Sep 7, 2026
34 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-6892-vi-mock-inherit-slice12-plugin-list branch September 7, 2026 05:11

Copy link
Copy Markdown
Contributor

LANDED — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

Merged at 2026-09-07T05:11:20Z as 340489334 (squash). Content probe on re-fetched origin/main at 05:12Z: COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs reads 17 entries with '@object-ui/plugin-list' at position 17; control plugin-designer present; packages/app-shell/src/views/ObjectView.createPredicates.test.tsx:104 inherits through importOriginal<typeof import('@object-ui/plugin-list')>() on main.

Slice 13 (@object-ui/fields) is claimed on objectui#6892 next; the card stays open (Part of).


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants